package models

import (
	"html/template"
	"io"
	"log"

	"gitee.com/Yu-eng/Myproject/my-go-blog/config"
)

type TemplateBlog struct {
	*template.Template
}

type HtmlTemplate struct {
	//定义不同使用场景下所需要的template
	Index      TemplateBlog
	Category   TemplateBlog
	Custom     TemplateBlog
	Detail     TemplateBlog
	Login      TemplateBlog
	Pigeonhole TemplateBlog
	Writing    TemplateBlog
}

//将模板写入的操作进行封装
func (t *TemplateBlog) WriteData(w io.Writer, data interface{}) {
	err := t.Execute(w, data)
	if err != nil {
		w.Write([]byte(err.Error()))
		log.Println(err)
	}
}

//实际对Template 模板进行初始化
//这里不负责直接的构建而是负责 调用模板的加载并对公共模板进行赋值
func InitTemplate(templateDir string) HtmlTemplate { //直接就给模板的路径

	//构建一个template 返回
	tp := readTemplate(
		[]string{"index", "category", "custom", "detail", "login", "pigeonhole", "writing"}, //通过名字查找并加载页面
		templateDir)
	//构建公共的Html模板并对其进行赋值
	var htmlTemplate HtmlTemplate
	htmlTemplate.Index = tp[0]
	htmlTemplate.Category = tp[1]
	htmlTemplate.Custom = tp[2]
	htmlTemplate.Detail = tp[3]
	htmlTemplate.Login = tp[4]
	htmlTemplate.Pigeonhole = tp[5]
	htmlTemplate.Writing = tp[6]
	return htmlTemplate
}

//实际构建模板
func readTemplate(templates []string, templateDir string) []TemplateBlog {
	//对模板进行对应的加载

	for _,view := range {
		//构建一个全新的模板
		t := template.New("index.html")
		//如何找到文件 找到当前路径
		path := config.Cfg.System.CurrentDir

		//访问博客首页模板的时候，因为有多个模板的嵌套，解析文件的时候，需要将涉及
		//到的所有模板都进行解析
		home := path + "/template/home.html"
		Header := path + "/template/layout/header.html"
		footer := path + "/template/layout/footer.html"
		personal := path + "/template/layout/personal.html"
		post := path + "/template/layout/post-list.html"
		pagination := path + "/template/layout/pagination.html"
		//这里添加了模板里面方法的映射 绑定了isODD函数
		t.Funcs(template.FuncMap{"isODD": isODD, "getNextName": getNextName, "date": Date})
		//解析文件
		t, err := t.ParseFiles(path+"/template/index.html", home, Header, footer, personal, post, pagination) //这里可以有多个文件,这里忽略了错误
		if err != nil {
			log.Panicln("解析模板出错！：", err)
		}
}